/*

cimahis - Software para el analisis de imagenes de corte histologico

Copyright (C) Andrés De Abreu 2010 <jadabreu @ gmail . com>


Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los términos
de la Licencia Pública General de GNU según es publicada por la Free Software Foundation,
bien de la versión 2 de dicha Licencia o bien (según su elección) de cualquier versión
posterior.

Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA,
incluso sin la garantía MERCANTIL implícita o sin garantizar la CONVENIENCIA PARA UN
PROPÓSITO PARTICULAR. Véase la Licencia Pública General de GNU para más detalles.

Debería haber recibido una copia de la Licencia Pública General junto con este programa.
Si no ha sido así, escriba a la Free Software Foundation, Inc.,
en 675 Mass Ave, Cambridge, MA 02139, EEUU.

    //ACERCA DE ventanaUmbral.cpp
    *
    * Declaración de la clase ventanaUmbral la cual se encarga de construir la interfaz
    * grafica para la selección del umbral para la segmentación por umbral
    *

*/

#include "color/UmbralHistogramas/ventanaumbral.h"
#include "ui_ventanaumbral.h"



VentanaUmbral::VentanaUmbral(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::VentanaUmbral)  //constructor
{
    ui->setupUi(this);

    lienzo = new lienzoHistograma();
    lienzo->setObjectName(QString::fromUtf8("label"));
    lienzo->setGeometry(QRect(0, 0, 255, 200));

    ui->verticalLayout->addWidget(lienzo);




}

VentanaUmbral::~VentanaUmbral() //destructor
{
    delete ui;
}

void VentanaUmbral::changeEvent(QEvent *e) //definición automatica realizada por QT (evento de cambio de idioma)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void VentanaUmbral::on_horizontalSlider_valueChanged(int value)
{
    //acción que se dispara cuando se mueve la barra de desplazamiento, value es el nuevo valor que tiene la barra

    valorUmbral=value;
    ui->labelIzquierda->setNum(value);
    lienzo->actulizarX(value,ui->horizontalSlider->maximum());

    cvReleaseImage(&imagenSegmentada);
    imagenSegmentada=cvCreateImage(cvGetSize(imagenOriginal),imagenOriginal->depth,imagenOriginal->nChannels);
    cvCopy(imagenOriginal,imagenSegmentada,0);

    if(tinte==true) //si es un histograma de tinte se debe mandar la mitad del valor ya que OpenCV define los histograms de tinte de 0 a 180
        umbral(imagenSegmentada,value/2);
    else
        umbral(imagenSegmentada,value);

    QImage *imagenVistaPrevia;
    imagenVistaPrevia=IplImageToQImage(imagenSegmentada);
    ui->vistaPrev->setPixmap((QPixmap::fromImage(*imagenVistaPrevia)));
    update();

}





void VentanaUmbral::setUmbral()  //evento que se dispara cuando se hace click en el boton "umbral óptimo"
{
    ui->horizontalSlider->setValue(valorUmbralOptimo);
}

void VentanaUmbral::fijarUmbralOptimo(int valor)
{
    if (tinte==false)
        valorUmbralOptimo=valor;
    else
        valorUmbralOptimo=valor/2;

}

void VentanaUmbral::cargarDatos(IplImage * a) //cargar los datos e imagenes en la interfaz
{
    histograma *h;
    fabricaObjetos f;
    IplImage * imagenHist;

    string espacioColor;
    espacioColor.append(a->colorModel);

    if(espacioColor=="H")
    {
        h=f.crearHistograma("HSV");
        ui->horizontalSlider->setMaximum(360);
        ui->labelDerecha->setText("360");
        lienzo->setGeometry(QRect(0, 0, 360, 200));
        tinte=true;
    }
    else
    {
        h=f.crearHistograma("RGB");
        tinte=false;
    }

    h->calcularHist(a);
    imagenHist=h->dibujarHist();

    imagenInterfaz=IplImageToQImage(imagenHist);
    lienzo->setPixmap(QPixmap::fromImage(*imagenInterfaz));

    lienzo->setScaledContents(true);

    valorUmbralOptimo=h->obtenerUmbralOptimo();

    imagenOriginal=cvCreateImage(cvSize(a->width,a->height),a->depth,a->nChannels);
    cvCopy(a,imagenOriginal,0);
    imagenSegmentada=cvCreateImage(cvGetSize(imagenOriginal),imagenOriginal->depth,imagenOriginal->nChannels);
    cvCopy(imagenOriginal,imagenSegmentada,0);

    QImage *imagenVistaPrevia;
    imagenVistaPrevia=IplImageToQImage(imagenOriginal);
    ui->vistaPrev->setPixmap(QPixmap::fromImage(*imagenVistaPrevia));


}

void VentanaUmbral::segmentarHistograma() //asignar la imagen segmentada a un areaImagen y cerrar la ventana actual
{

    area->modificarImagenCvAux(imagenSegmentada);
    area->modificarArea(imagenSegmentada);
    area->show();
    this->close();

}


void VentanaUmbral::obtenerArea(areaImagen *a) //obtener el area donde sera dibujada la imagen segmentada
{
    area=a;
}


void VentanaUmbral::cerrarVentana() //acción que se ejecuta cuando hacemos click en el boton cancelar
{

    this->close();
    area->close();
}
